import axios from 'axios'
const source = axios.CancelToken.source(); // 这是取消当前请求发送的

// 进行一些全局配置
axios.defaults.baseURL = 'http://127.0.0.1:7001'
// axios.defaults.timeout = 5000
axios.defaults.withCredentials = true // 允许携带cookie

const isAction = (actionRights: any, path: string, method: string) => {
  // 不带参数或者带参数的正则规则 
  // [0 - 9] * 表示数字0到9可以出现0次或多次  ? 表示出现0次或1次  i忽略大小写
  const reg:any = new RegExp(`^${actionRights.rightsPath}(/[0-9]*)?$`, 'i')
  if (reg.test(path) && actionRights.rightsMethod === method) return true
  if (actionRights.children) {
    for (let i = 0; i < actionRights.children.length; i++){
      const item = actionRights.children[i]
      // 利用递归套递归去实现请求权限的过滤
      if(isAction(item,path,method)) return true
    }
  }
  return false
}

// 得到用户请求权限
const getActionRights = () => {
  let data:any = sessionStorage.getItem('userInfo')
  if (!data) return null
  const userInfo = JSON.parse(data)
  const actionRights = userInfo.rightsTree.filter((rights: any) => {
    if(rights.rightsType === 'action') return rights
  })
  return actionRights[0]
}

// console.log(actionRights);

// 添加请求拦截器
axios.interceptors.request.use(function (config: any) {
  // 在每一次发送请求的时候都获取一次用户的请求权限
  const actionRights = getActionRights()
  // console.log(config);
  const curPath = config.url || '';
  const curMethod = config.method || '';
  // 在发送请求之前做些什么
  // 设置请求头
  // config.headers.Authorization = sessionStorage.getItem('token')
  if (curPath.startsWith('/api/v1')) { // 排除了非/api/v1开头的请求，即登录注册等等
    const flag = isAction(actionRights, curPath, curMethod)
    // console.log(flag,flag);
    if (!flag) {
      // 如果不通过，则将当前请求取消，不发送当次请求
      // 使用 cancel token 取消请求
      config.cancelToken = source.token;
      source.cancel('没有对应的请求权限')
    }
  }
  return config
}, function (error:any) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response:any) {
  // 对响应数据做点什么
  return response
}, function (error:any) {
  // 对响应错误做点什么
  return Promise.reject(error)
})
// 封装自己的get/post方法
export default {
  axios,
  get: function (path = '', data = {}) {
    return new Promise(function (resolve, reject) {
      axios.get(path, {
        params: data
      })
        .then(function (response:any) {
          resolve(response)
        })
        .catch(function (error:any) {
          reject(error)
        })
    })
  },
  post: function (path = '', data = {}) {
    return new Promise(function (resolve, reject) {
      axios.post(path, data)
        .then(function (response:any) {
          resolve(response)
        })
        .catch(function (error:any) {
          reject(error)
        })
    })
  },
  delete: function (path = '',data = {}) {
    return new Promise(function (resolve, reject) {
      axios.delete(path,{data:data})
        .then(function (response:any) {
          resolve(response)
        })
        .catch(function (error:any) {
          reject(error)
        })
    })
  },
  put: function (path = '', data = {}) {
    return new Promise(function (resolve, reject) {
      axios.put(path,data)
        .then(function (response:any) {
          resolve(response)
        })
        .catch(function (error:any) {
          reject(error)
        })
    })
  },
  all: function (list:any[]) {
    return new Promise(function (resolve, reject) {
      axios.all(list)
        .then(axios.spread(function (...result:any) {
          // 两个请求现在都执行完成
          resolve(result)
        }))
        .catch(function (err:any) {
          reject(err)
        })
    })
  }
}